package com.lzq.leetcode.lanqiao;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class s16 {

    public static void main(String[] args) {
        long num = 2021041820210418L;
        //如果直接赋值,计算机默认数字是int类型，会报错。所以要在后面加'l'，转换为long类型

        //定义一个ArrayList数组，存放num的因子
        ArrayList<Long> arr = new ArrayList<>();

        //从1开始遍历，遍历到num的平方根结束。不需要把num遍历一遍，这样算法复杂都也非常大，重点看for循环里面的语句
        for ( long i = 1 ; i <= Math.sqrt(num) ; i++ ){

            if ( num % i == 0 ){
                arr.add(i);     //如果能被整除，就放到arr数组中

                //！！！重点在这里，当i能被num整除的情况下，求出num关于i的另外一个除数n
                //这样，for循环不需要从1遍历到num。可以通过较小的因子，求出另外一个较大的因子
                long n = num / i;

                //如果num = Math.sqrt(num)*Math.sqrt(num),那么由较小的因子求较大的因子时，会重复，要排除这种情况
                if ( n != i ){      //当然，此时num，不会出现这种情况。如果num=4，就会出现这种情况
                    arr.add(n);     //将较大的因子放入arr数组
                }

            }

        }

        //System.out.println(arr.size());   //num一共有128个因子

        //三层for循环依次遍历即可。 128^3 = 2097152 计算机完全可以在短时间内算出结果
        int count = 0;
        for ( long i : arr ){
            for ( long j : arr ){
                for ( long k : arr ){
                    if ( i * j * k == num ){
                        count++;
                    }
                }
            }
        }
        System.out.println(count);
    }
}
